import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
  // HttpStatus,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

// 定义统一响应格式的接口
interface ApiResponse<T> {
  success: boolean;
  data: T;
  message: string;
  statusCode: number;
}

// @Injectable() 标记这是一个可注入的服务
@Injectable()
export class TransformInterceptor<T>
  implements NestInterceptor<T, ApiResponse<T>>
{
  // intercept方法是拦截器的核心方法
  // context: 包含请求的上下文信息
  // next: 用于将请求传递给下一个拦截器或最终的处理程序
  intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<ApiResponse<T>> {
    // 通过管道操作符处理响应
    return next.handle().pipe(
      map((data) => {
        // 获取当前请求的响应对象
        const response = context.switchToHttp().getResponse();

        // 返回统一格式的响应
        return {
          success: true,
          // 实际响应数据
          data: data || null,
          // 成功消息，默认为空字符串
          message: '',
          // HTTP状态码
          statusCode: response.statusCode,
        };
      }),
    );
  }
}
